package com.lbw.config;

import com.lbw.chatMemory.MySqlChatMemory;
import com.lbw.aiTools.TimeTools;
import com.lbw.chatMemory.MySqlRAGChatMemory;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.ai.vectorstore.redis.RedisVectorStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ChatModelConfig {

    // ollama本地部署的模型
    @Autowired
    private OllamaChatModel ollamaChatModel;

    // openai远程调用的模型
    @Autowired
    private OpenAiChatModel openAiChatModel;

    // 自定义工具
    @Autowired
    private TimeTools timeTools;

    // 正常聊天会话记忆和记忆存储
    @Autowired
    private MySqlChatMemory mySqlChatMemory;

    // pdf聊天会话记忆和记忆存储
    @Autowired
    private MySqlRAGChatMemory mySqlRAGChatMemory;

    // 内存向量库，ollama本地部署的向量化模型
    @Autowired
    private VectorStore ollamaVectorStore;

    // 内存向量库，openai远程调用的向量化模型
    @Autowired
    private VectorStore openAiVectorStore;

    // redis向量库，ollama本地部署的向量化模型
    @Autowired
    private RedisVectorStore redisVectorStore;

    /**
     * ollama本地部署gemma3
     * @return
     */
    @Bean
    public ChatClient gemma3ChatClient() {
        return ChatClient.builder(ollamaChatModel)
                .defaultAdvisors(
                        new SimpleLoggerAdvisor(),
                        MessageChatMemoryAdvisor.builder(mySqlChatMemory).build()
                )
                .defaultTools(timeTools)
                .build();
    }

    /**
     * 使用ollama本地部署的大模型，pdf聊天记忆，使用redis向量库，本地部署的向量化模型
     * @return
     */
    @Bean
    public ChatClient pdfChatClient() {
        return ChatClient.builder(ollamaChatModel)
                .defaultSystem("请根据提供的上下文和已有工具回答问题，不要自己猜测")
                .defaultAdvisors(
                        new SimpleLoggerAdvisor(),
                        MessageChatMemoryAdvisor.builder(mySqlRAGChatMemory).build(),
                        QuestionAnswerAdvisor.builder(redisVectorStore)
                                .searchRequest(SearchRequest.builder()
                                        .similarityThreshold(0.5d) // 相似度阈值
                                        .topK(2) // 返回的文档片段数量
                                        .build())
                                //.promptTemplate(new PromptTemplate("上下文：{question_answer_context}\\n问题：{query}")) // 这个会替代QuestionAnswerAdvisor中的PromptTemplate，会拼接到usermessage中
                                .build()
                )
                .defaultTools(timeTools)
                .build();
    }

    /**
     * 使用openai远程调用的模型，pdf聊天记忆，使用redis向量库，本地部署的向量化模型
     * @return
     */
    @Bean
    public ChatClient openAiPdfChatClient() {
        return ChatClient.builder(openAiChatModel)
                .defaultSystem("请根据提供的上下文回答问题，不要自己猜测，用表格输出")
                .defaultAdvisors(
                        new SimpleLoggerAdvisor(),
                        MessageChatMemoryAdvisor.builder(mySqlRAGChatMemory).build(),
                        QuestionAnswerAdvisor.builder(redisVectorStore)
                                .searchRequest(SearchRequest.builder()
                                        .similarityThreshold(0.5d) // 相似度阈值
                                        .topK(2) // 返回的文档片段数量
                                        .build())
                                .build()
                )
                .defaultTools(timeTools)
                .build();
    }

    /**
     * 通义千问
     * @return
     */
    @Bean
    public ChatClient qwen3ChatClient() {
        return ChatClient.builder(openAiChatModel)
                /*.defaultOptions(
                        ChatOptions.builder().model("qwen-max-latest").build()
                )*/
                .defaultAdvisors(
                        new SimpleLoggerAdvisor(),
                        MessageChatMemoryAdvisor.builder(mySqlChatMemory).build()
                )
                .defaultTools(timeTools)
                .build();
    }

}
